unit uERP_DAO_Usuario;

interface

uses uERP_Usuario, uQuery, uErro, uERP_NextID;

type
  TDAOUsuario = class(TNextID)

    {$REGION '<< Public >>'}

      public

        {$REGION '<< Methods >>'}

          constructor Create(); overload;

          function Exists(const a_Login: String; const a_ID: Int64): Boolean;

          function Recover(const a_Objeto: TUsuario): TUsuario; overload;
          function Recover(const a_Login: String; const a_Senha: String): TUsuario; overload;

          procedure New(const a_Objeto: TUsuario);

        {$ENDREGION}

    {$ENDREGION}

  end;

implementation

uses
  SysUtils, uERP_Constantes, uERP_InstanceClass, DB;

{$REGION '<< TDAOUsuario >>'}

procedure TDAOUsuario.New(const a_Objeto: TUsuario);
var
  Query: TMyQuery;
begin
  Query := TMyQuery.Create();
  try
    Query.SetParameterValue(uERP_Constantes.c_Field_WAS_Usuario_Login, ftString, a_Objeto.Login);
    Query.SetParameterValue(uERP_Constantes.c_Field_WAS_Usuario_Senha, ftString, a_Objeto.Senha);
    Query.SetParameterValue(uERP_Constantes.c_Field_WAS_Usuario_Nome, ftString, a_Objeto.Nome);

    Query.Insert(
              uERP_Constantes.c_NomeTB_Usuario,

              uERP_Constantes.c_Field_WAS_Usuario_Login + ',' +
              uERP_Constantes.c_Field_WAS_Usuario_Senha + ',' +
              uERP_Constantes.c_Field_WAS_Usuario_Nome
            );
  finally
    FreeAndNil(Query);
  end;
end;

constructor TDAOUsuario.Create;
begin
  inherited Create(uERP_Constantes.c_Sequence_Usuario);
end;

function TDAOUsuario.Exists(const a_Login: String; const a_ID: Int64): Boolean;
var
  t_Query: TMyQuery;
begin
  Result := False;
  t_Query := TMyQuery.Create();
  try
    t_Query.SelectWhere(
            uERP_Constantes.c_Field_Usuario,
            uERP_Constantes.c_NomeTB_Usuario,
            '('+ uERP_Constantes.c_Field_Usuario_Login + ' = ' + QuotedStr(a_Login) + ') AND (' + uERP_Constantes.c_Field_Usuario_ID + ' <> ' + IntToStr(a_ID) + ')',
            uERP_Constantes.c_Field_Usuario_Login
    );

    Result := not t_Query.IsEmpty;
  finally
    if Assigned(t_Query)
      then FreeAndNil(t_Query);
  end;
end;

function TDAOUsuario.Recover(const a_Login, a_Senha: String): TUsuario;
begin
  Result := TUsuario.Create();
  Result.Login := a_Login;

  try
    Result := Self.Recover(Result);
  finally
    if not Assigned(Result) or not (a_Senha = Result.Senha)
      then Result := nil;
  end;
end;

function TDAOUsuario.Recover(const a_Objeto: TUsuario): TUsuario;
var
  t_Query: TMyQuery;
begin
  Result := nil;
  t_Query := TMyQuery.Create();
  try
    t_Query.SelectWhere(
            uERP_Constantes.c_Field_Usuario,
            uERP_Constantes.c_NomeTB_Usuario,
            '('+ uERP_Constantes.c_Field_Usuario_Login + ' = ' + QuotedStr(a_Objeto.Login) + ') OR (' + uERP_Constantes.c_Field_Usuario_ID + ' = ' + IntToStr(a_Objeto.ID) + ')',
            uERP_Constantes.c_Field_Usuario_Login
    );

    if not t_Query.IsEmpty
      then Result := TInstanceClass.GetInstance().NewUsuario(t_Query);
  finally
    if Assigned(t_Query)
      then FreeAndNil(t_Query);
  end;
end;

{$ENDREGION}

end.
